package cn.aicnn.chatssespringboot.model;

import java.math.BigDecimal;
import java.math.RoundingMode;

public class FileMetrics {
    public String fileName;
    public int linesOfCode;
    public int commentLines;
    public int cyclomaticComplexity;
    public int externalInputs;      // 外部输入(加权后)
    public int externalOutputs;     // 外部输出(加权后)
    public int externalQueries;     // 外部查询(加权后)
    public int internalLogicalFiles; // 内部逻辑文件
    public int externalInterfaces;  // 外部接口文件
    public int wmc = 0;
    public int dit = 1;
    public int noc = 0;
    public int cbo = 0;
    public int rfc = 0;
    public int lcom = 0;
    public int useCasePoints = 0;
    public int actors = 1;
    public int useCases = 0;
    public double commentDensity = 0;

    // 增加consultMetric，表示质量类别
    public String consultMetric;

    // ========== 新增 LK 度量指标 ==========
    public int cs = 0;                   // 类规模（Class Size）：类中方法总数
    public int noo = 0;                  // 方法重写数（Number of Overrides）
    public int noa = 0;                  // 增加方法数（Number of Additions）：子类新增方法数
    public double si = 0.0;              // 特征化指数（Specialization Index）：NOO / (NOO + NOA)

    // 计算commentDensity
    public void calculateCommentDensity() {
        if (linesOfCode == 0) {
            this.commentDensity = 0.0;
        } else {
            double density = (double) commentLines / linesOfCode * 100;
            BigDecimal bd = new BigDecimal(density).setScale(2, RoundingMode.HALF_UP);
            this.commentDensity = bd.doubleValue();
        }
    }
    public void calculateSI() {
        BigDecimal bd = BigDecimal.valueOf(this.si)  // 使用valueOf而不是直接new BigDecimal
                .setScale(2, RoundingMode.HALF_UP);
        this.si = bd.doubleValue();  // 注意：转回double仍可能丢失精确表示
    }


    // 评估质量（新增 LK 度量逻辑）
    public void assessQuality() {
        // 计算特征化指数 SI（避免除零）
        if (noo + noa > 0) {
            calculateSI();
        } else {
            si = 0.0;
        }

        // 综合评估原有指标 + LK 度量
        boolean isGoodLK = (cs <= 20 && noo <= 5 && si >= 0.2);    // LK 的“Good”阈值
        boolean isAvgLK = (cs <= 30 && noo <= 10 && si >= 0.1);    // LK 的“Average”阈值

        if (wmc <= 50 && useCasePoints >= 1 && cbo <= 15 && isGoodLK) {
            consultMetric = "Good";       // 全部指标（包括LK）优秀
        } else if (wmc <= 60 && useCasePoints >= 1 && cbo <= 20 && isAvgLK) {
            consultMetric = "Average";    // 大部分指标适中
        } else {
            consultMetric = "Poor";       // 存在明显问题
        }
    }
}
